// new.target 指向被new调用的构造函数
function Foo() {
  console.log(new.target === Foo);
}
Foo(); // 普通函数中访问不到：false
new Foo(); // 构造函数访问到：true

// 类的继承中的 new.target 指向的是初始化类的类定义
class C {
  constructor() {
    console.log(new.target);
  }
}
class D extends C {
  constructor() {
    super();
  }
}
var c = new C(); // class C{constructor(){console.log(new.target);}}
var d = new D(); // class D extends C{constructor(){super();}}



// Object.prototype.constructor
// 1. Object 实例的 constructor 数据属性返回一个引用，指向创建该实例对象的构造函数
const o1 = {};
o1.constructor === Object; // true, 访问的Object.prototype.constructor

// 2. 继承关系：TypeError -> Error -> Object
const o = new TypeError(); 
const proto = Object.getPrototypeOf;
proto(o).constructor === TypeError; // true
proto(proto(o)).constructor === Error; // true
proto(proto(proto(o))).constructor === Object; // true

// 3. constructor 修改不会对 instanceof 产生影响，
const arr = []; 
arr.constructor = String; // 给[]添加constructor属性
arr.constructor === String; // true
arr instanceof String; // false
arr instanceof Array; // true

arr.__proto__ = String.prototype
arr instanceof String; // true
